<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>版本和平台兼容性</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="runtime-config-locks.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="runtime-config.html">快退</a></td><td width="60%" align="center" valign="bottom">章17. 服务器配置</td><td width="10%" align="right" valign="top"><a href="runtime-config.html">快进</a></td><td width="10%" align="right" valign="top"><a href="runtime-config-preset.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="RUNTIME-CONFIG-COMPATIBLE">17.12. 版本和平台兼容性</a></h1>
<div class="SECT2"><h2 class="SECT2"><a name="RUNTIME-CONFIG-COMPATIBLE-VERSION">17.12.1. 以前的 PostgreSQL 版本</a></h2>
<div class="VARIABLELIST">
<dl>
<dt><a name="GUC-ADD-MISSING-FROM"></a><tt class="VARNAME">add_missing_from</tt> (<tt class="TYPE">boolean</tt>)</dt>
<dd><p>为 <tt class="LITERAL">on</tt> 时，如果查询引用的表没有出现的话将自动增加到 <tt class="LITERAL">FROM</tt> 子句中。这个行为不是 SQL 的标准，并且很多人不喜欢它，因为它会隐藏错误(比如该引用别名的时候引用了表名)。缺省是 <tt class="LITERAL">off</tt> 。这个变量可以设置为 <tt class="LITERAL">on</tt> 以便和 8.1 之前的 PostgreSQL 版本兼容，因为那些版本的行为是缺省允许。</p>
<p>请注意，即使打开了这个变量，那么查询每次隐含的 <tt class="LITERAL">FROM</tt> 项引用也都会触发一个警号信息。我们鼓励用户更新他们的应用，不要依赖这个行为，方法是在查询的 <tt class="LITERAL">FROM</tt> 子句(如果是 <tt class="COMMAND">DELETE</tt> 的话则是 <tt class="LITERAL">USING</tt> 子句)里添加所有查询需要的表引用。</p></dd>
<dt><a name="GUC-ARRAY-NULLS"></a><tt class="VARNAME">array_nulls</tt> (<tt class="TYPE">boolean</tt>)</dt>
<dd><p>控制数组输入解析器是否将未用引号界定的 <tt class="LITERAL">NULL</tt> 作为数组的一个 NULL 元素。默认为 <tt class="LITERAL">on</tt> 表示允许向数组中输入 NULL 值。但 8.2 之前的版本不支持这么做，因此将把 <tt class="LITERAL">NULL</tt> 当作字符串 "NULL" 。如果希望向后兼容这种旧式行为，那么可以设为 <tt class="LITERAL">off</tt> 。</p>
<p>即使该值被设为 <tt class="LITERAL">off</tt> 也仍然能够创建包含 NULL 值的数组。</p></dd>
<dt><a name="GUC-BACKSLASH-QUOTE"></a><tt class="VARNAME">backslash_quote</tt> (<tt class="TYPE">string</tt>)</dt>
<dd><p>控制字符串文本中的单引号是否能够用 <tt class="LITERAL">\'</tt> 来表示。首选的符合 SQL 标准的方法是将其双写(<tt class="LITERAL">''</tt>)，但是 PostgreSQL 在历史上也可以用 <tt class="LITERAL">\'</tt> 来表示。不过使用 <tt class="LITERAL">\'</tt> 容易导致安全漏洞，因为在某些多字节字符集(比如 GBK/GB18030)中存在最后一个字节等于 <tt class="LITERAL">\</tt> 的 ASCII 值的字符。如果客户端代码没有做到正确逃逸，那么将会导致 SQL 注入攻击。如果服务器拒绝使用 <tt class="LITERAL">\'</tt> 来表示单引号，那么就可以避免这种风险。<tt class="VARNAME">backslash_quote</tt> 的可用值是 <tt class="LITERAL">on</tt>(总是允许), <tt class="LITERAL">off</tt>(总是拒绝), <tt class="LITERAL">safe_encoding</tt>(缺省，仅在客户端字符集编码不会在多字节字符末尾包含 <tt class="LITERAL">\</tt> 的 ASCII 值时允许)</p>
<p>需要注意的是，在字符串文本符合 SQL 标准的情况下，<tt class="LITERAL">\</tt> 没有任何其它含义。这个参数影响的是如何处理不符合标准的字符串文本，包括明确的字符串逃逸语法(<tt class="LITERAL">E'...'</tt>)。</p></dd>
<dt><a name="GUC-DEFAULT-WITH-OIDS"></a><tt class="VARNAME">default_with_oids</tt> (<tt class="TYPE">boolean</tt>)</dt>
<dd><p>这个选项控制 <tt class="COMMAND">CREATE TABLE</tt> 和 <tt class="COMMAND">CREATE TABLE AS</tt> 在既没有声明 <tt class="LITERAL">WITH OIDS</tt> 也没有声明 <tt class="LITERAL">WITHOUT OIDS</tt> 的情况下，是否在新创建的表中包含 OID 字段。它还决定 <tt class="COMMAND">SELECT INTO</tt> 创建的表里面是否包含 OID 。在 PostgreSQL 8.1 之后 <tt class="VARNAME">default_with_oids</tt> 缺省为 <tt class="LITERAL">off</tt> 。以前版本的 PostgreSQL 缺省为 on 。</p>
<p>我们反对在用户表中使用 OID ，因此大多数安装应该关闭这个变量。需要 OID 的表应该在创建表的时候声明 <tt class="LITERAL">WITH OIDS</tt> 。</p></dd>
<dt><a name="GUC-ESCAPE-STRING-WARNING"></a><tt class="VARNAME">escape_string_warning</tt> (<tt class="TYPE">boolean</tt>)</dt>
<dd><p>打开的时候，如果在普通的字符串文本里(<tt class="LITERAL">'...'</tt> 语法)出现了一个反斜扛(<tt class="LITERAL">\</tt>)并且 <tt class="VARNAME">standard_conforming_strings</tt> 被关闭，那么就会发出一个警告。缺省是 <tt class="LITERAL">on</tt> 。</p>
<p>应该使用逃逸字符串语法(<tt class="LITERAL">E'...'</tt>)来做逃逸，因为在将来的 PostgreSQL 版本里，普通的字符串对待反斜扛的行为将与标准兼容。</p></dd>
<dt><a name="GUC-REGEX-FLAVOR"></a><tt class="VARNAME">regex_flavor</tt> (<tt class="TYPE">string</tt>)</dt>
<dd><p>正则表达式"风味"可以设置为 <tt class="LITERAL">advanced</tt>(缺省), <tt class="LITERAL">extended</tt>, <tt class="LITERAL">basic</tt> 。<tt class="LITERAL">extended</tt> 设置对于和 7.4 以前的 PostgreSQL 精确的向下兼容很有用。参阅<a href="functions-matching.html#POSIX-SYNTAX-DETAILS">节9.7.3.1</a>获取细节。</p></dd>
<dt><a name="GUC-SQL-INHERITANCE"></a><tt class="VARNAME">sql_inheritance</tt> (<tt class="TYPE">boolean</tt>)</dt>
<dd><p>这个选项控制继承语义，尤其是在缺省时是否在各种命令里把子表包括进来。如果设为 <tt class="LITERAL">off</tt> 那么默认不包含字表(相当于默认使用 <tt class="LITERAL">ONLY</tt> 关键字)。这是为了兼容 7.1 之前版本而设置的。参考<a href="ddl-inherit.html">节5.8</a>获取关于继承的更多信息。</p></dd>
<dt><a name="GUC-STANDARD-CONFORMING-STRINGS"></a><tt class="VARNAME">standard_conforming_strings</tt> (<tt class="TYPE">boolean</tt>)</dt>
<dd><p>控制普通字符串文本(<tt class="LITERAL">'...'</tt>)中是否按照 SQL 标准把反斜扛当普通文本。缺省为 <tt class="LITERAL">off</tt> ，表示反斜扛当作逃逸对待。将来的版本会把这个设置的缺省值改成 <tt class="LITERAL">on</tt> ，这样字符串文本的语法就变为符合标准了。应用可以检查这个参数来判断字符串文本如何被处理。建议明确使用逃逸字符串语法(<tt class="LITERAL">E'...'</tt>)来逃逸字符。</p></dd>
</dl>
</div>
</div>
<div class="SECT2"><h2 class="SECT2"><a name="RUNTIME-CONFIG-COMPATIBLE-CLIENTS">17.12.2. 平台和客户端兼容性</a></h2>
<div class="VARIABLELIST">
<dl>
<dt><a name="GUC-TRANSFORM-NULL-EQUALS"></a><tt class="VARNAME">transform_null_equals</tt> (<tt class="TYPE">boolean</tt>)</dt>
<dd><p>如果打开，那么表达式 <tt class="LITERAL"><tt class="REPLACEABLE"><i>expr</i></tt> = NULL</tt> 或 <tt class="LITERAL">NULL = <tt class="REPLACEABLE"><i>expr</i></tt></tt> 将被当做 <tt class="LITERAL"><tt class="REPLACEABLE"><i>expr</i></tt> IS NULL</tt> 处理，也就是说，如果 <tt class="REPLACEABLE"><i>expr</i></tt> 得出 NULL 值则返回真，否则返回假。正确的 SQL 标准兼容的 <tt class="LITERAL"><tt class="REPLACEABLE"><i>expr</i></tt> = NULL</tt> 行为总是返回 NULL(未知)。因此这个选项缺省是 <tt class="LITERAL">off</tt> 。</p>
<p>不过，在 Microsoft Access 里的过滤表单生成的查询好像使用的是 <tt class="LITERAL"><tt class="REPLACEABLE"><i>expr</i></tt> = NULL</tt> 测试 NULL ，因此，如果你使用这个界面访问数据库，你可能想把这个选项打开。因为形如 <tt class="LITERAL"><tt class="REPLACEABLE"><i>expr</i></tt> = NULL</tt> 的表达式总是返回 NULL ，它们在应用中也不常见，因此这个选项实际上没有什么害处。但是新用户常常在涉及 NULL 的表达式语义上感到胡涂，因此缺省时不打开这个选项。</p>
<p>请注意这个选项只影响 <tt class="LITERAL">= NULL</tt> 形式，不包括其它比较操作符或者其它与一些涉及等号操作符的表达式计算(比如 <tt class="LITERAL">IN</tt>)。因此，这个选项不是垃圾程序的狗皮膏药。</p>
<p>请参考<a href="functions-comparison.html">节9.2</a>获取相关信息。</p></dd>
</dl>
</div>
</div>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="runtime-config-locks.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="runtime-config-preset.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">锁管理</td><td width="34%" align="center" valign="top"><a href="runtime-config.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">预置选项</td></tr>
</table>
</div>
</body></html>